home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / pascal / tpb4_src.zip / EXTRACT.PAS < prev    next >
Pascal/Delphi Source File  |  1988-09-13  |  6KB  |  211 lines

  1. { TPBoard 4.2 Copyright (c) 1987,88 by Jon Schneider & Rick Petersen  
  2.   Portions Copyright (c) 1986,87 by Steve Fox and Les Archambault  
  3.   
  4.   Last modified  ::  3-4-88 9:46 pm 
  5. }
  6.  
  7. {$R-}                             {Range checking off}
  8. {$B-}                             {Boolean complete evaluation off}
  9. {$S-}                             {Stack checking off}
  10. {$I+}                             {I/O checking on}
  11. {$N-}                             {No numeric coprocessor}
  12.  
  13. Unit Extract;
  14.  
  15. Interface
  16.  
  17. Uses
  18.   TPCrt, Dos, Globals, Core1, Core2;
  19.   
  20.   
  21. function Read_Arc_Hdr : Boolean;
  22.  
  23. procedure ExtractArc(var XfrName : DosFileName; var ok_to_send : Boolean);
  24.  
  25. procedure ExtractLbr(var XfrName : DosFileName; remaining : LongInt;
  26.                      var ok_to_send  : Boolean);
  27.                      
  28.                      
  29.   {==========================================================================}
  30.   
  31.   
  32. Implementation
  33.  
  34.  
  35.   function Read_Arc_Hdr : Boolean;
  36.     { read a file header from the archive file }
  37.     { FALSE = eof found; TRUE = header found }
  38.     
  39.   var
  40.     bt              : Byte;
  41.     OK              : Boolean;
  42.     
  43.   begin                           {read_arc_hdr}
  44.     OK := True;
  45.     Endfile := False;
  46.     {$I-}
  47.     BlockRead(arc_file, bt, 1);
  48.     if bt <> 26 then
  49.       OK := False
  50.     else
  51.       begin
  52.         BlockRead(arc_file, HdrVer, 1);
  53.         if HdrVer < 0 then
  54.           OK := False
  55.         else
  56.           if HdrVer = 0 then      { special end of file marker }
  57.             Endfile := True
  58.           else
  59.             if HdrVer = 1 then
  60.               begin
  61.                 BlockRead(arc_file, Hdr, 23);
  62.                 HdrVer := 2;
  63.                 Hdr.Length := Hdr.size
  64.               end
  65.             else
  66.               BlockRead(arc_file, Hdr, 27);
  67.       end;
  68.     {$I+}
  69.     if IoResult <> 0 then OK := False;
  70.     if OK and (not Endfile) then
  71.       Read_Arc_Hdr := True
  72.     else
  73.       Read_Arc_Hdr := False;
  74.   end;
  75.   
  76.   
  77.   
  78.   procedure ExtractArc(var XfrName : DosFileName; var ok_to_send : Boolean);
  79.   
  80.   var
  81.     i, block_size   : Integer;
  82.     found, OK       : Boolean;
  83.     XfrFile         : file;
  84.     bt              : Byte;
  85.     remaining       : LongInt;
  86.     fn              : DosFileName;
  87.     buf             : array[1..512] of Byte;
  88.     
  89.   begin                           {ExtractArc}
  90.     SetSect(SetName);
  91.     found := False;
  92.     Assign(arc_file, ArcReq);
  93.     {$I-}
  94.     Reset(arc_file, 1) {$I+} ;
  95.     OK := (IoResult = 0);
  96.     ok_to_send := True;
  97.     while (Read_Arc_Hdr) and OK and (not found) do
  98.       begin
  99.         i := 1;
  100.         while (Hdr.name[i-1] <> #0) and (i < 14) do
  101.           begin
  102.             fn[i] := Upcase(Hdr.name[i-1]);
  103.             i := Succ(i);
  104.           end;
  105.         fn[0] := Chr(Pred(i));
  106.         if Pos('.', fn) = 0 then fn := fn+'.';
  107.         if XfrName = fn then
  108.           found := True
  109.         else
  110.           begin
  111.             {$I-}
  112.             Seek(arc_file, (FilePos(arc_file)+Hdr.size)) {$I+} ;
  113.             OK := (IoResult = 0)
  114.           end;
  115.       end;
  116.     if found then
  117.       begin
  118.         OK := True;
  119.         remaining := Hdr.size-1;
  120.         if (diskfree(Ord(Upcase(SetDrv[1]))-64) > remaining) then
  121.           begin
  122.             Assign(XfrFile, XfrName);
  123.             {$I-}
  124.             Rewrite(XfrFile, 1);
  125.             buf[1] := 26;
  126.             buf[2] := HdrVer;
  127.             BlockWrite(XfrFile, buf, 2);
  128.             BlockWrite(XfrFile, Hdr, 27);
  129.             bt := 12;
  130.             BlockWrite(XfrFile, bt, 1) {$I+} ;
  131.             OK := (IoResult = 0);
  132.             while ((remaining > 0) and OK) do
  133.               begin
  134.                 block_size := min(remaining, 512);
  135.                 {$I-}
  136.                 BlockRead(arc_file, buf, block_size);
  137.                 BlockWrite(XfrFile, buf, block_size) {$I+} ;
  138.                 OK := (IoResult = 0);
  139.                 remaining := remaining-block_size;
  140.               end;
  141.             buf[1] := 26;
  142.             buf[2] := 0;
  143.             if OK then
  144.               BlockWrite(XfrFile, buf, 2)
  145.             else
  146.               begin
  147.                 WriteLn(com, 'Couldn''t extract file.');
  148.                 ok_to_send := False;
  149.               end;
  150.           end
  151.         else
  152.           begin
  153.             WriteLn(com, 'Not enough disk space to extract file.');
  154.             ok_to_send := False;
  155.           end;
  156.       end
  157.     else
  158.       begin
  159.         WriteLn(com, 'Couldn''t extract file.');
  160.         ok_to_send := False
  161.       end;
  162.     {$I-}
  163.     Close(arc_file);
  164.     Close(XfrFile);
  165.     if (not ok_to_send) then Erase(XfrFile);
  166.     {$I+}
  167.     OK := (IoResult = 0);
  168.     SetSect(HomName);
  169.   end;                            {ExtractArc}
  170.   
  171.   
  172.   
  173.   procedure ExtractLbr(var XfrName : DosFileName; remaining : LongInt;
  174.                        var ok_to_send  : Boolean);
  175.                        
  176.   var
  177.     block_size      : Integer;
  178.     XfrFile         : file;
  179.     buf             : array[1..512] of Byte;
  180.     OK              : Boolean;
  181.     
  182.   begin                           {ExtractLbr}
  183.     ok_to_send := True;
  184.     Assign(XfrFile, XfrName);
  185.     {$I-}
  186.     Rewrite(XfrFile, 1) {$I+} ;
  187.     OK := (IoResult = 0);
  188.     while ((remaining > 0) and OK) do
  189.       begin
  190.         block_size := min(remaining, 512);
  191.         {$I-}
  192.         BlockRead(libr_file, buf, block_size);
  193.         BlockWrite(XfrFile, buf, block_size) {$I+} ;
  194.         OK := (IoResult = 0);
  195.         remaining := remaining-block_size;
  196.       end;
  197.     if (not OK) then
  198.       begin
  199.         WriteLn(com, 'Couldn''t extract file.');
  200.         ok_to_send := False;
  201.       end;
  202.     {$I-}
  203.     Close(XfrFile);
  204.     if (not ok_to_send) then Erase(XfrFile) {$I+} ;
  205.     OK := (IoResult = 0);
  206.     SetSect(HomName);
  207.   end;                            {ExtractLbr}
  208.   
  209. end.                              { of EXTRACT.PAS}
  210. 
  211.